# !/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
===========================
@Time : 2022/7/24 0024 11:32
@Author : 测试开发工程师
@File : 7. linux 三剑客之 awk.py
@Software: PyCharm
============================
"""


"""
awk: 数据分段处理  是一种处理文本的语言，是一个强大的文本分析工具。

awk 基本语法
    awk 是 linux 下的一个命令，同时也是一种语言解析引擎
    awk 具备完整的编程特性。比如执行命令，网络请求等
    精通 awk ，是一个 linux 工作者的必备技能
    语法 awk 'pattern{action}',pattern 匹配表达式，acyion 行为表达式
    pattern 参数表达式：
        正则匹配  $1-/pattern/ /pattern/
        比较表达式 $2>2 $1=='b'
    action 行为表达式{action}
        若不写，默认是{print $0}
        打印 {print $0} {print $2}
        赋值 {$1='abc'}
        处理函数
        原始内容 $0
        更新后内容{$1=$1;print $0}       
    
awk 上下文变量
    开始 BEGING 结束 END
    行数 NR
    字段与字段数 $1 $2 ...$NF NF
    正行 $0
    字段分隔符 FS
    输出数据的字段分隔符 OFS
    记录分隔符 RS
    输出字段的行分隔符 ORS

字段变量用法
    -F 参数指定字段分隔符，可以用| 指定多个 - 多分隔符 -F '<|>'
    BEGIN{FS="_"}也可以表示分隔符
    $0 代表当前的记录
    $1 代表第一个字段
    $N 代表第 N 个字段
    $NF 代表最后一个字段
    $(NF-1) 代表倒数第二个字段
    
awk pattern 匹配表达式案例
    开始和结束： awk 'BEGIN{}END{}'
    正则匹配：
        整行匹配 awk '/Running/'
        字段匹配 awk '$2-/xxx/'
    行数表达式
        取第二行 awk 'NR==2'
        去掉第一行 awk 'NR>1'
    区间选择：
        awk '/aa/,/bb/'
        awk '/1/,NR==2'
    
举例：
1. 打印输出内容的行数
    echo '1
    2
    3
    4'|  awk 'NR==1'
结果是：1


echo '1
    2
    3
    4'|  awk '$1-/2/'
结果是：2


2. 区间取值
    echo 'a,1
    b,2
    c,3' | awk '/a/,/b/'
结果是：a,1
       b,2

3. 把一行按照相应的匹配拆分成多行
echo 1:2:3 | awk 'BEGIN{RS=":"}{print $0}'
结果是：
    1
    2
    3

4. 将多行转化成一行
echo '1
2
3' | awk 'BEGIN{RS="",FS="\n",OFS=":"}{$1=$1;print $0}'
结果是： 1：2：3：

echo '1
2
3' | awk 'BEGIN{ORS=":"}{$1=$1;print $0}'
结果是： 1：2：3：

计算平均数
    echo '1,10
    2,20
    3,30' | awk 'BEGIN{total=0;FS=','}{total+=$2}END{print total/NR}'
结果是：20


awk 的词典结果 array
    array 是稀疏矩阵，类似 python 的词典类型
    统计多家机构的营业额   | awk '{data[$1]+=$3}' END{for(k in data) print k,data[k]}' 
    统计多家机构的营业额平均值  | awk '{data[$1]+=$3;count[$1]+=1;}' END{for(k in data) print k,data[k]/count[k]}' 
 
5. awk 程序读取文本文件，只显示第 1 个 数据字段的值
cat data2.txt
One line of test text.
Two lines of test text.
Three lines of test text.

awk '{print $1}' data2.txt

结果是：
One
Two
Three  

6. echo "My name is Rich" | awk '{$4="Christine"; print $0}'
结果是：
    My name is Christine
    
7. awk BEGIN 关键字
cat data3.txt
Line 1
Line 2
Line 3

awk 'BEGIN {print "The data3 File Contents:"} > {print $0}' data3.txt
结果是：
The data3 File Contents:
Line 1
Line 2
Line 3


8. awk END 关键字





"""